package tt.dz.order.util.refund;

import org.springframework.stereotype.Component;

import tt.dz.order.dao.SysApplicationContextAware;
import tt.dz.order.util.OrderConstant.OrderPayChannelCode;
import tt.dz.order.util.OrderConstant.OrderPayWay;

/**
 * 
 * 
 * @name 退款请求工厂
 * @author Anson
 * @version 1.0
 * @summary 贫血型的工厂模式<br>
 *          bean的实例化方式不能扩展，若要扩展这块实例化方式，则采用抽象的工厂模式可实现当前方式<br>
 *          根据当前业务，贫血模式即可满足需求
 * 
 * @desc 根据不同类型的支付方式以及支付渠道，获取对应的退款bean<br>
 *       通过spring创建实例化的退款请求<br>
 *       退款RefundingRequest实现类的spring中的id定义协议:<br>
 *       "RefundingRequest_支付方式索引_支付渠道索引"<br>
 *       例如:第三方实时支付的ali支付渠道，则spring的id配置为:@Component(value="RefundingRequest_1_ALI")
 *       <br>
 *       若只存在支付方式，不存在支付去掉，则其中的id协议中的支付渠道为”“<br>
 *       例如:@Component(value="RefundingRequest_100_ALI")
 *
 */
@Component
public class RefundingReuestFactory {

	public static final String SPRING_PRE_IDENTIIED = "RefundingRequest";

	private static final String SPRING_IDENTIIED_UNNULL_CHANNEL_FMT = "%s_%s_%s";

	private static final String SPRING_IDENTIIED_NULL_CHANNEL_FMT = "%s_%s";

	/**
	 * 根据不同类型的支付方式以及支付渠道，获取对应的退款bean<br>
	 * 通过spring创建实例化的退款请求<br>
	 * 退款RefundingRequest实现类的spring中的id定义协议:<br>
	 * "RefundingRequest_支付方式索引_支付渠道索引"<br>
	 * 例如:第三方实时支付的ali支付渠道，则spring的id配置为:@Component(value="RefundingRequest_1_ALI")
	 * <br>
	 * 若只存在支付方式，不存在支付去掉，则其中的id协议中的支付渠道为”“<br>
	 * 例如:@Component(value="RefundingRequest_100_ALI")
	 * 
	 * @param payway
	 *            支付方式
	 * @param channelCode
	 *            支付渠道
	 * @return {@linkplain RefundingRequest}
	 *         返回可能为空：支付方式为空，以及查询的spring中管理的bean未找到
	 * 
	 */
	public RefundingRequest generate(OrderPayWay payway, OrderPayChannelCode channelCode) {
		if (payway == null) {
			return null;
		}
		String beanIdentifiedName = RefundingReuestFactory.generateSpringId(payway, channelCode);
		return SysApplicationContextAware.getApplication().getBean(beanIdentifiedName, RefundingRequest.class);
	}

	/**
	 * 根据当前工厂实例化的spring的id生成协议，创建对应的查询id <br>
	 * 退款RefundingRequest实现类的spring中的id定义协议: <br>
	 * "RefundingRequest_支付方式索引_支付渠道索引"<br>
	 * 例如:第三方实时支付的ali支付渠道，则spring的id配置为:@Component(value="RefundingRequest_1_ALI")
	 * <br>
	 * 若只存在支付方式，不存在支付去掉，则其中的id协议中的支付渠道为”“<br>
	 * 例如:@Component(value="RefundingRequest_100_ALI")
	 * 
	 * @param payway
	 * @param channelCode
	 * @return
	 */
	public static String generateSpringId(OrderPayWay payway, OrderPayChannelCode channelCode) {
		boolean isNullChannel = channelCode == null;
		String springIdentifiedName = isNullChannel
				? String.format(RefundingReuestFactory.SPRING_IDENTIIED_NULL_CHANNEL_FMT,
						RefundingReuestFactory.SPRING_PRE_IDENTIIED, payway.value())
				: String.format(RefundingReuestFactory.SPRING_IDENTIIED_UNNULL_CHANNEL_FMT,
						RefundingReuestFactory.SPRING_PRE_IDENTIIED, payway.value(), channelCode.value());
		return springIdentifiedName;
	}

}
